/*
 * @Author: NingJian
 * @Date: 2021-08-26 17:55:36
 * @LastEditTime: 2021-12-29 16:16:00
 * @LastEditors: NingJian
 * @Description: 
 * @FilePath: /itools/bin/template/BasedOnBSP/musev3_fpga_demo/tc/muse/config.h
 * 
 */


// 总线接口说明
// 1、Core共包含4条总线，具体如下：
// 1）Front_Port（前端总线）：AXI4 Slave接口，在多core情况下，可以通过Master core的AXI4 Master接口对Slave core内存进行访问。
// 2）Periph_Port（外设总线）：APB Master接口，挂载低速外设。
// 3）System_Port_0（系统总线）：AXI Master接口，挂载高速存储器件，如ROM、RAM、Flash等。
// 4）System_Port_1（系统总线）：AXI Master接口，预留访问DDR存储空间使用。
// 2、总线地址地址空间分布如下：
// Name	Base	Top	Size	Protocal	Data_Width	Description
// front_port_axi4_0				AXI4	32bit	Slave
// periph_port_apb_0	0x4000_0000	0x5fff_ffff	0x2000_0000(512MB)	APB	32bit	Master
// sys_port_axi4_0	0x6000_0000	0x7fff_ffff	0x2000_0000(512MB)	AXI4	32bit	Master
// sys_port_axi4_1	0x8000_0000	0xffff_ffff	0x8000_0000(2GB)	AXI4	32bit	Master

#pragma once

#ifndef RISCV_BASE_ADDR
#define RISCV_BASE_ADDR 0x40000000
#endif

#ifndef PCIE_BASE_ADDR
#define PCIE_BASE_ADDR 0x40002000
#endif

#define DDR_BASE_ADDR 0x80000000

#define RISCV_UART_BAND (*((int *)(RISCV_BASE_ADDR | 0x18)))

#define RISCV_ISR_REG (*((volatile unsigned int *)(RISCV_BASE_ADDR | 0x6c)))

#define PCIE_REG_X(x) (*((volatile unsigned int *)(PCIE_BASE_ADDR | (x))))

#define PCIE_RISCV_CAL_DONE PCIE_REG_X(0x04)

#define PCIE_REG_GENERAL0 PCIE_REG_X(0x14)

#define PCIE_REG_GENERAL1 PCIE_REG_X(0x18)

#define PCIE_MUSE_REG_INST_BASE_ADDR PCIE_REG_X(0x1C)

#define PCIE_MUSE_REG_ACT_BASE_ADDR0 PCIE_REG_X(0x20)

#define PCIE_MUSE_REG_ACT_BASE_ADDR1 PCIE_REG_X(0x24)

#define PCIE_MUSE_REG_WEIGHT_BASE_ADDR PCIE_REG_X(0x28)

#define PCIE_MUSE_REG_OUTPUT_BASE_ADDR PCIE_REG_X(0x2C)

#define PCIE_MUSE_REG_INST_LEN_REAL PCIE_REG_X(0x30)

#define PCIE_MUSE_REG_INST_LEN_READ PCIE_REG_X(0x34)

#define PCIE_MUSE_REG_CONFIG_END PCIE_REG_X(0x38)

#define PCIE_MUSE_REG_INTERRUPT_STATE PCIE_REG_X(0x3C)


#define MUSE_REG_INST_BASE_ADDR 0x44

#define MUSE_REG_ACT_BASE_ADDR0 0x48

#define MUSE_REG_ACT_BASE_ADDR1 0x4c

#define MUSE_REG_WEIGHT_BASE_ADDR 0x50

#define MUSE_REG_OUTPUT_BASE_ADDR 0x54

#define MUSE_REG_INST_LEN_REAL 0x58

#define MUSE_REG_INST_LEN_READ 0x5c

#define MUSE_REG_CONFIG_END 0x60

#define MUSE_REG_INTERRUPT_STATE 0x6C

#define MUSE_REG_X(base, x) (*((volatile unsigned int *)(base | (x))))


//#define DEBUG 1

struct MUSE_CONTEXT {
        // ==================================== //
        uint32_t  head_size;
        // muse 的id: 0 ， 1 ， 2 ，3 内部muse ,  其他为外部muse
        uint8_t muse_id;
        // muse 的状态
        uint8_t muse_status;
        // 当前运行的层
        uint8_t run_layer_number;
        // 当前运行的层的状态
        uint8_t run_layer_status;
        // 当前指令的地址
        uint32_t run_layer_inst_addr;
        // 当前指令的长度
        uint32_t run_layer_inst_len_read;
        uint32_t run_layer_inst_len_real;
        // muse的基地址
        uint32_t base_addr;
        // muse 使用的ddr空间起始地址
        uint32_t ddr_addr;
        // 指令地址偏移。相对于ddr_addr
        uint32_t inst_addr_offset;
        // 权重地址偏移。相对于ddr_addr
        uint32_t wet_addr_offset;
        // 激活数据地址偏移。相对于ddr_addr
        uint32_t act_addr_offset;
        // 输出数据地址偏移。相对于ddr_addr
        uint32_t out_addr_offset;
        // 当前层运行的时间（微秒）
        uint32_t run_layer_times;
        // debug info for muse reg value, read only
        uint32_t muse_reg_inst_base_addr;
        uint32_t muse_reg_act_base_addr0;
        uint32_t muse_reg_act_base_addr1;
        uint32_t muse_reg_weight_base_addr;
        uint32_t muse_reg_output_base_addr;
        uint32_t muse_reg_inst_len_real;
        uint32_t muse_reg_inst_len_read;
        uint32_t muse_reg_config_end;
        uint32_t muse_reg_interrupt_state;
        // ==================================== //
};


#define MUSE_SUPPORT_MAX_NUMBER 10

 struct MUSE_CONTROL_INFO {
        uint8_t muses_work_status[MUSE_SUPPORT_MAX_NUMBER];
        uint32_t muses_ddr_addr[MUSE_SUPPORT_MAX_NUMBER];
};